<?php

use ticky\session;

function setglobal($key, $value, $group = null) {
    global $_G;
    $key = explode('/', $group === null ? $key : $group . '/' . $key);
    $p = &$_G;
    foreach ($key as $k) {
        if (!isset($p[$k]) || !is_array($p[$k])) {
            $p[$k] = array();
        }
        $p = &$p[$k];
    }
    $p = $value;
    return true;
}

function getglobal($key, $group = null) {
    global $_G;
    $key = explode('/', $group === null ? $key : $group . '/' . $key);
    $v = &$_G;
    foreach ($key as $k) {
        if (!isset($v[$k])) {
            return null;
        }
        $v = &$v[$k];
    }
    return $v;
}

/**
 * 获取输入参数
 */
if (!function_exists('redirect')) {

    function redirect($uri, $refresh = 0) {
        \ticky\response::redirect($uri, $refresh);
    }

}
/**
 * 获取输入参数
 */
if (!function_exists('input')) {

    function input($key, $default = null) {
        return ticky\request::getParam($key, $default);
    }

}
/**
 * 获取输入GET参数
 */
if (!function_exists('get')) {

    function get($key, $default = null) {
        return \ticky\request::get($key, $default);
    }

}

function getip() {
    return \ticky\request::getClientIp();
}

/**
 * 获取输入POST参数
 */
if (!function_exists('post')) {

    function post($key, $default = null) {
        return \ticky\request::post($key, $default);
    }

}
/**
 * 获取配置信息
 */
if (!function_exists('config')) {

    function config($name, $key = null) {
        if (is_null($name)) {
            \ticky\config::all();
        } else {
            return \ticky\config::get($name, $key);
        }
    }

}
/**
 * 优化的文件加载(只会加载一次)
 */
if (!function_exists('load')) {

    function load($file, $data) {
        return \ticky\helper\file::load($file, $data);
    }

}
/**
 * 生成url
 */
if (!function_exists('url')) {

//url('del',array('modelid'=>$val['modelid']))
    function url($url = '', $vars = '', $domain = false) {
        return \ticky\route::url($url, $vars, $domain);
    }

}

/**
 * 实例化db类
 */
if (!function_exists('db')) {

    function db($tablename = '') {
        $object = \ticky\db::instance($tablename);
        return $object;
    }

}
if (!function_exists('cache')) {

    function cache($name, $value = '') {
        $cache = \ticky\cache::instance();
        if ($value === '') {
            return $cache->get($name);
        } elseif (isset($value)) {
            return $cache->set($name, $value);
        } elseif (is_null($value)) {
            $cache->delete($name);
        } else {
            return $cache->get($name);
        }
    }

    /**
     * 写入缓存
     * @param $name 缓存名称
     * @param $data 缓存数据
     * @param $timeout 过期时间
     * @return    int
     */
    function setcache($name, $data, $timeout = 0) {
        $cache = \ticky\cache::instance();
        return $cache->set($name, $data, $timeout);
    }

    /**
     * 读取缓存
     * @param string $name 缓存名称
     * @return    string
     */
    function getcache($name) {
        $cache = \ticky\cache::instance();
        return $cache->get($name);
    }

    /**
     * 删除缓存
     * @param string $name 缓存名称
     * @param $flush 是否清空所有缓存
     * @return    bool
     */
    function delcache($name, $flush = false) {
        $cache = \ticky\cache::instance();
        return !$flush ? $cache->delete($name) : $cache->clean();
    }

}
/**
 * cookie类封装
 */
if (!function_exists('cookie')) {

    function cookie($name, $value) {
        $cookie = ticky\cookie::instance();
        if (is_null($value)) {
            $cookie->delete($name);
        } elseif (isset($value)) {
            $cookie->set($name, $value);
        } else {
            return $cookie->get($name);
        }
    }

}
/**
 * session类封装
 */
if (!function_exists('session')) {

    /**
     * Session管理
     * @param string|array  $name session名称，如果为数组表示进行session设置
     * @param mixed         $value session值
     * @param string        $prefix 前缀
     * @return mixed
     */
    function session($name, $value = '', $prefix = null) {
        if (is_array($name)) {
            // 初始化
            session::init($name);
        } elseif (is_null($name)) {
            // 清除
            session::clear('' === $value ? null : $value);
        } elseif ('' === $value) {
            // 判断或获取
            return 0 === strpos($name, '?') ? session::has(substr($name, 1), $prefix) : session::get($name, $prefix);
        } elseif (is_null($value)) {
            // 删除
            return session::delete($name, $prefix);
        } else {
            // 设置
            return session::set($name, $value, $prefix);
        }
    }

}

/**
 * 加密解密
 *
 * $string： 明文 或 密文
 * $operation：DECODE表示解密,其它表示加密 ENCODE
 * $key： 密匙
 * $expiry：密文有效期
 * @example 示例
 * $coe = authcode('123456', 'ENCODE');//加密
 * echo $coe . '<br>';
 * echo authcode($coe) . '<br>';//解密
 */
function authcode($string, $operation = 'DECODE', $key = 'luomingui', $expiry = 0) {
    $ckey_length = 4;
    $keya = md5(substr($key, 0, 16));
    $keyb = md5(substr($key, 16, 16));
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
    $cryptkey = $keya . md5($keya . $keyc);
    $key_length = strlen($cryptkey);
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
    $string_length = strlen($string);
    $result = '';
    $box = range(0, 255);
    $rndkey = array();
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if ($operation == 'DECODE') {
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    } else {
        return $keyc . str_replace('=', '', base64_encode($result));
    }
}

if (!function_exists('lang')) {

//    /**
//     * 获取和设置语言定义(不区分大小写)
//     * @param string|array $name 语言变量
//     * @param mixed $value 语言值或者变量
//     * @return mixed
//     */
//    function L($name = null, $value = null) {
//        if ($value != null) {
//            \ticky\lang::set($name, $value);
//        }
//        return \ticky\lang::get($name);
//    }

    /**
     * 获取语言变量值
     * @param string    $name 语言变量名
     * @param array     $vars 动态变量值
     * @param string    $lang 语言
     * @return mixed
     */
    function L($name, $vars = [], $lang = '') {
        return \ticky\lang::get($name, $vars, $lang);
    }

}

/**
 * 用于实例化一个model对象  如：M('article');
 * @param $classname	 model类名称 如 article.class.php，只传入article即可
 * @return object
 */
function M($classname) {
    return load::load_model($classname);
}

/**
 * id加密
 * @param $id
 * @return string
 */
function id_encode($id) {
    return \ticky\helper\id::encode($id);
}

/**
 * id解密
 * @param $string
 * @return string
 */
function id_decode($string) {
    return \ticky\helper\id::decode($string);
}

/**
 *  提示信息页面跳转
 *
 * @param     string  $msg      消息提示信息
 * @param     string  $gourl    跳转地址,stop为停止
 * @param     int     $limittime  限制时间
 * @return    void
 */
function showmsg($msg, $gourl = '', $limittime = 3) {
    if (\ticky\request::isAjax()) {
        if ($gourl == '' || $gourl == 'y' || $limittime == 'y' || $limittime == 3) {
            $status = 'y';
        } else {
            $status = 'n';
        }
        \ticky\response::ajax(['status' => $status, 'info' => $msg]);
    } else {
        if (!dintval($limittime)) {
            $limittime = 3;
        }
        \ticky\app::showmsg($msg, $gourl, $limittime);
        if (APP_DEBUG) {
            \ticky\debug::stop();
            \ticky\debug::message();
        }
    }
    exit;
}

/* * **************************************常用函数********************************************************************** */

function return_bytes($val) {
    if (is_integer($val)) {
        $val = trim($val);
        $last = strtolower($val{strlen($val) - 1});
        switch ($last) {
            case 'g': $val *= 1024;
            case 'm': $val *= 1024;
            case 'k': $val *= 1024;
        }
        return $val;
    }
}

/**
 * 加载extend目录下的文件
 * @param string $path 文件地址（包括文件全称）
 * @param string $m 模块(如果模块名为空，则加载根目录下的common)
 */
function load_extend($path, $m = '') {
    if (!$m) {
        if (is_file(ROOT_PATH . 'extend' . DS . $path)) {
            return include ROOT_PATH . 'extend' . DS . $path;
        }
    } else {
        if (is_file(APP_PATH . DS . $m . DS . 'extend' . DS . $path)) {
            return include APP_PATH . DS . $m . DS . 'extend' . DS . $path;
        }
    }
}

/**
 * 获取当前页面完整URL地址
 */
function get_url() {
    $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
    $php_self = $_SERVER['PHP_SELF'] ? safe_replace($_SERVER['PHP_SELF']) : safe_replace($_SERVER['SCRIPT_NAME']);
    $path_info = isset($_SERVER['PATH_INFO']) ? safe_replace($_SERVER['PATH_INFO']) : '';
    $relate_url = isset($_SERVER['REQUEST_URI']) ? safe_replace($_SERVER['REQUEST_URI']) : $php_self . (isset($_SERVER['QUERY_STRING']) ? '?' . safe_replace($_SERVER['QUERY_STRING']) : $path_info);
    return $sys_protocal . HTTP_HOST . $relate_url;
}
